home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / csrc1.arc / DUAL.C < prev    next >
C/C++ Source or Header  |  1989-07-27  |  6KB  |  308 lines

  1.  
  2. /*
  3.  * Convert a MACRO-11 programme from
  4.  * tasteless upper case to tasteful dual
  5.  * case. Try to to clever things with
  6.  * names and comments.
  7.  */
  8. #include <stdio.h>
  9.  
  10. #define    NCPS    6
  11. #define    NB    20
  12. #define    NOCORE    (char *) -1
  13. #define    LETTER    0
  14. #define    DIGIT    1
  15. #define    OTHER    2
  16.  
  17. struct    sym
  18. {
  19.     struct    sym *s_sp;
  20.     char    s_id[NCPS];
  21. };
  22.  
  23. struct    sym    *sym    = NULL;
  24.  
  25. char    *autab[] = {
  26.     "i",
  27.     "c",
  28.     "unix",
  29.     "eof",
  30.     NULL
  31. };
  32.  
  33. char    ctype[] = {
  34.     OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  35.     OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  36.     OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  37.     OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  38.     OTHER,    OTHER,    OTHER,    OTHER,    LETTER,    OTHER,    OTHER,    OTHER,
  39.     OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    LETTER,    OTHER,
  40.     DIGIT,    DIGIT,    DIGIT,    DIGIT,    DIGIT,    DIGIT,    DIGIT,    DIGIT,
  41.     DIGIT,    DIGIT,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  42.     OTHER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,
  43.     LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,
  44.     LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,
  45.     LETTER,    LETTER,    LETTER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  46.     OTHER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,
  47.     LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,
  48.     LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,    LETTER,
  49.     LETTER,    LETTER,    LETTER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER
  50. };
  51.  
  52. main(argc, argv)
  53. char *argv[];
  54. {
  55.     register char *p, *q;
  56.     register c;
  57.     char b[NB], id[NCPS];
  58.  
  59.     while ((c = getchar()) != EOF) {
  60.         if (c == ';') {
  61.             heading();
  62.             continue;
  63.         }
  64.         while (c != EOF && c != '\n') {
  65.             if (c == ';')
  66.                 comment();
  67.             else if (c == '<') {
  68.                 putchar(c);
  69.                 while ((c = getchar())!=EOF && c!='>')
  70.                     putchar(c);
  71.                 putchar('>');
  72.             } else if (c == '\'') {
  73.                 putchar(c);
  74.                 if ((c = getchar()) != EOF)
  75.                     putchar(c);
  76.             } else if (c == '\"') {
  77.                 putchar(c);
  78.                 if ((c = getchar()) != EOF) {
  79.                     putchar(c);
  80.                     if ((c = getchar()) != EOF)
  81.                         putchar(c);
  82.                 }
  83.             } else if (ctype[c] == LETTER) {
  84.                 getid(c, id);
  85.                 if (eq(id, ".ascii") || eq(id, ".asciz"))
  86.                     ascii(id);
  87.                 else {
  88.                     p = b;
  89.                     while ((c=getchar())==' ' || c=='\t') {
  90.                         if (p >= &b[NB-1])
  91.                             error("Too much b!\n");
  92.                         *p++ = c;
  93.                     }
  94.                     if (c == '=')
  95.                         saveid(id);
  96.                     ungetc(c, stdin);
  97.                     putid(id);
  98.                     q = b;
  99.                     while (q < p)
  100.                         putchar(*q++);
  101.                 }
  102.             } else {
  103.                 if (c >= 'A' && c <= 'Z')
  104.                     c += 'a'-'A';
  105.                 putchar(c);
  106.             }
  107.             c = getchar();
  108.         }
  109.         putchar('\n');
  110.     }
  111. }
  112.  
  113. heading()
  114. {
  115.     register char *p;
  116.     register c, f;
  117.     char b[NB];
  118.     int s;
  119.  
  120.     f = 1;
  121.     do {
  122.         putchar(';');
  123.         s = 0;
  124.         while ((c = getchar())!=EOF && c!='\n') {
  125.             s = 1;
  126.             if (c == ' ' || c == '.') {
  127.                 putchar(c);
  128.                 if (c == '.')
  129.                     f = 1;
  130.                 continue;
  131.             }
  132.             p = b;
  133.             do {
  134.                 if (p >= &b[NB-1])
  135.                     error("Too much b!\n");
  136.                 if (c >= 'A' && c <= 'Z')
  137.                     c += 'a'-'A';
  138.                 *p++ = c;
  139.                 c = getchar();
  140.             } while (c!=EOF && c!='\n' && c!=' ' && c!='.');
  141.             *p = '\0';
  142.             ungetc(c, stdin);
  143.             makedual(b, f);
  144.             printf("%s", b);
  145.             f = 0;
  146.         }
  147.         putchar('\n');
  148.         if (s == 0)
  149.             f = 1;
  150.     } while ((c = getchar()) == ';');
  151.     ungetc(c, stdin);
  152. }
  153.  
  154. makedual(b, f)
  155. register char *b;
  156. {
  157.     register char *p, **up;
  158.  
  159.     up = autab;
  160.     while ((p = *up++) != NULL) {
  161.         if (equal(b, p)) {
  162.             makeupper(b);
  163.             return;
  164.         }
  165.     }
  166.     if (f && b[0]>='a' && b[0]<='z')
  167.         b[0] -= 'a'-'A';
  168. }
  169.  
  170. makeupper(p)
  171. register char *p;
  172. {
  173.     register c;
  174.  
  175.     while ((c = *p) != '\0') {
  176.         if (c >= 'a' && c <= 'z')
  177.             *p -= 'a'-'A';
  178.         ++p;
  179.     }
  180. }
  181.  
  182. comment()
  183. {
  184.     register c;
  185.  
  186.     putchar(';');
  187.     while ((c = getchar()) == ' ' || c == '\t')
  188.         ;
  189.     if (c != '\n')
  190.         putchar(' ');
  191.     if (c >= 'a' && c <= 'z')
  192.         c -= 'a'-'A';
  193.     while (c != EOF && c != '\n') {
  194.         putchar(c);
  195.         if ((c = getchar()) >= 'A' && c <= 'Z')
  196.             c += 'a'-'A';
  197.     }
  198.     ungetc(c, stdin);
  199. }
  200.  
  201. getid(c, id)
  202. register c;
  203. char *id;
  204. {
  205.     register char *p;
  206.  
  207.     p = id;
  208.     do {
  209.         if (p < &id[NCPS]) {
  210.             if (c >= 'A' && c <= 'Z')
  211.                 c += 'a'-'A';
  212.             *p++ = c;
  213.         }
  214.     } while ((c = getchar())!=EOF && (ctype[c]==LETTER || ctype[c]==DIGIT));
  215.     while (p < &id[NCPS])
  216.         *p++ = '\0';
  217.     ungetc(c, stdin);
  218. }
  219.  
  220. upper(id)
  221. register char *id;
  222. {
  223.     register struct sym *sp;
  224.  
  225.     if (id[1] == '.' || id[1] == '$')
  226.         return (1);
  227.     if (id[2] == '.' || id[2] == '$')
  228.         return (1);
  229.     sp = sym;
  230.     while (sp != NULL) {
  231.         if (eq(id, sp->s_id))
  232.             return (1);
  233.         sp = sp->s_sp;
  234.     }
  235.     return (0);
  236. }
  237.  
  238. eq(a, b)
  239. register char *a, *b;
  240. {
  241.     register n;
  242.  
  243.     n = NCPS;
  244.     while (n--)
  245.         if (*a++ != *b++)
  246.             return (0);
  247.     return (1);
  248. }
  249.  
  250. putid(id)
  251. char *id;
  252. {
  253.     register char *p;
  254.     register c;
  255.  
  256.     if (upper(id)) {
  257.         p = id;
  258.         while (p < &id[NCPS] && (c = *p++) != '\0') {
  259.             if (c >= 'a' && c <= 'z')
  260.                 c -= 'a'-'A';
  261.             putchar(c);
  262.         }
  263.     } else
  264.         printf("%.?s", NCPS, id);
  265. }
  266.  
  267. ascii(id)
  268. char *id;
  269. {
  270.     register c, d;
  271.  
  272.     putid(id);
  273.     while ((c = getchar())!=EOF && c!='\n' && c!=';') {
  274.         if (c == ' ' || c == '\t') {
  275.             putchar(c);
  276.             continue;
  277.         }
  278.         d = c;
  279.         putchar(c);
  280.         while ((c = getchar())!=EOF && c!='\n' && c!=d)
  281.             putchar(c);
  282.         if (c == d)
  283.             putchar(c);
  284.         else
  285.             ungetc(c, stdin);
  286.     }
  287.     ungetc(c, stdin);
  288. }
  289.  
  290. saveid(id)
  291. char *id;
  292. {
  293.     register struct sym *np, *sp;
  294.  
  295.     sp = sym;
  296.     while (sp != NULL) {
  297.         if (eq(id, sp->s_id))
  298.             return;
  299.         sp = sp->s_sp;
  300.     }
  301.     np = alloc(sizeof(struct sym));
  302.     if (np == NOCORE)
  303.         error("Out of space!\n");
  304.     np->s_sp = sym;
  305.     sym = np;
  306.     copy(np->s_id, id, NCPS);
  307. }
  308.